---
title: "Модуль node-local-dns"
---

## Описание модуля

Разворачивает кэширующий DNS-сервер на каждом узле кластера, экспортирует данные в `Prometheus` для удобного анализа работы DNS в кластере [на доске](#grafana-dashboard) Grafana.

Модуль состоит из оригинального `CoreDNS`, разворачиваемого в DaemonSet на все узлы, с добавлением алгоритма настройки сети и настройки правил iptables.

### Назначение

Существует ряд проблем в стандартной работе DNS в Kubernetes, которые могут привести к неоправданному снижению ключевых показателей работы сервиса:
- Отсутствие кэширования запросов (в Linux из коробки нет кэша, соответственно, и в подах его тоже нет из коробки).
- Все DNS-запросы из контейнера влекут за собой сетевой запрос к кластерному DNS. Запросы к ресурсам в рамках одного узла все равно приводят к сетевым запросам.
- Запрос из пода сначала разрешается в кластерных DNS-зонах и только потом отправляется на внешние DNS-серверы. Например, запрос на `ya.ru` будет разрешаться сначала в кластерных зонах, таких как `cluster.local`, `svc.cluster.local`, `<namespace>.svc.cluster.local`, и только после получения отрицательных ответов, то есть по сути только с более чем второго раза, будет разрешаться правильно.

В случае появившихся небольших сетевых задержек качество сервиса может значительно деградировать из-за приведенных выше проблем.

Одно из решений — поставить DNS-сервер на каждый узел, для чего и предназначен настоящий модуль.

Внешние запросы также будут сначала пытаться разрешаться по цепочке внутренних зон, но только отсутствующие в кэше. При большой нагрузке (при большом количестве запросов на одни и те же записи в секунду, как это часто и бывает) такого поведения достаточно для значительного улучшения DNS-резолвинга.

## Grafana dashboard

Дашборд `Kubernetes / DNS (node local)` отображает:
- общие графики (позволяют оценить в целом картину работы DNS);
- графики по узлам (позволяют глубже изучить найденную на общем графике проблему узла);
- графики по upstream (позволяют оценить работу кластерного DNS и серверов узлов, указанных в `/etc/resolv.conf`).

## Как работает

На каждом узле модуль выполняет следующие настройки:
- Настраивает интерфейс с IP-адресом clusterIP сервиса `kube-dns`.
- Запускает кэширующий CoreDNS, который слушает на этом адресе.
- Добавляет *хитрое* правило в iptables: если сокет открыт — идти туда, если не открыт – работает обычная магия Kubernetes для clusterIP.

Само правило, которое и позволяет сделать беспроблемный fallback:

```bash
-A PREROUTING -d <IP-адрес kube-dns> -m socket --nowildcard -j NOTRACK
```

### Особенности конфигурации CoreDNS

Основные характеристики конфигурации CoreDNS:
- кэширование всех запросов;
- forward всех DNS-запросов в ClusterIP кластерного DNS.
